/**
 * @Author 1928
 * @Date 2022/4/19 15:44
 * @Description  递归
 */
public class TextWei {
    /**
     * 用递归输出1 2 ... 10
      * @param n
     */
    public static void func(int n) {
        if (n == 1){
            System.out.println(n);
            return;
        }
        func(n-1);
        System.out.println(n);
    }

    public static void main1(String[] args) {
        func(10);
    }

    /**
     * 递推求n!
     * @param n
     * @return
     */
    public static int func1(int n){
        if (n ==1){
            return 1;
        }
        int tex = n*func1(n-1);
        return tex;
    }

    public static void main2(String[] args) {
        System.out.println(func1(5));
    }

    /**
     * 按顺序打印一个数字的每一位
     * @param n
     * @return
     */
    public static void func2(int n){
        if (n<=9){
            System.out.println(n);
            return ;
        }
        func2(n/10);
        System.out.println(n%10);
    }

    public static void main3(String[] args) {
        func2(123);
    }

    /**
     * 递归计算1+2+...+10
     * @param n
     * @return
     */
    public static int func3(int n){
        if(n == 1){
            return 1;
        }
        int tmo = n+func3(n-1);
        return tmo;
    }

    public static void main4(String[] args) {
        System.out.println(func3(10));
    }

    /**
     * 输入一个非负整数，返回组成他的数字之和  递归逆序
      * @param n
     * @return
     */
    public static int func4(int n){
        if(n<=9){
            return n;
        }
        int ret = n%10 +func4(n/10);
        return ret;
    }

    /**
     * 输入一个非负整数，返回组成他的数字之和  递归顺序
     * @param args
     */
    public static void main7(String[] args) {
        System.out.println(func4(123));
    }

    static int sum = 0;
    public static void func5(int n){
        if (n<=9){
            sum+=n;
            return;
        }
        func5(n/10);
        sum+=(n%10);
    }

    public static void main9(String[] args) {
        func5(12345);
        System.out.println(sum);
    }

    /**
     * 递归顺序打印数组
     * @param array
     */
    public static void print(int[] array,int n) {
        if (n == 1){
            System.out.println(array[n-1]);
            return;
        }
        print(array,n-1);
        System.out.println(array[n-1]);
    }
    public static void main10(String[] args) {
        int[] array = {1,2,3,4,5};
        print(array,array.length);
    }

    /**
     * 递归逆序打印数组
     * @param array
     * @param n
     */
    public static void print1(int[] array,int n) {
        if (n == 1) {
            System.out.println(array[n - 1]);
            return;
        }
        System.out.println(array[n - 1]);
        print1(array, n - 1);
    }

    public static void main13(String[] args) {
        int[] array = {1,2,3,4,5};
        print1(array,5);
    }

    /**
     * 正宗递归逆序打印数组
     * @param array
     * @param n
     */
    public static void print2(int[] array,int n) {
        if (n == array.length-1) {
            System.out.println(array[n]);
            return;
        }
        print2(array, n + 1);
        System.out.println(array[n]);
    }

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        print2(array,0);
    }




    /**
     * 递归斐波那契数列
     * @param n
     * @return
     */
    public static int fib(int n) {
        if (n == 1){
            return 0;
        }
        if (n == 2){
            return 1;
        }
        int top = fib(n-1) + fib(n-2);
        return top;
    }

    public static void main11(String[] args) {
        System.out.println(fib(4));
    }

    /**
     * 循环做斐波那契数列（迭代）
     * @param n
     * @return
     */
    public static int fib1(int n) {
        if (n==1){
            return 0;
        }
        if (n==2){
            return 1;
        }
        int f1 = 0;
        int f2 = 1;
        int f3 = 0;
        for (int i = 3; i <= n; i++) {
            f3 = f1 +f2;
            f1 =f2;
            f2 =f3;
        }
        return f3;
    }

    public static void main12(String[] args) {
        System.out.println(fib1(1));
        System.out.println(fib1(2));
        System.out.println(fib1(3));
        System.out.println(fib1(45));
    }

}
